<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Linux 时间标准</title>
  
    <meta name="author" content="jouyouyun">

    <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
    <!--[if lt IE 9]>
      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
    <![endif]-->

    <!-- Le styles -->
    <link href="/assets/twitter/stylesheets/bootstrap.min.css" type="text/css" rel="stylesheet" media="all">
<link href="/assets/twitter/stylesheets/style.css" type="text/css" rel="stylesheet" media="all">
<link href="/assets/twitter/widgets/google_prettify/stylesheets/twitter-bootstrap.css" type="text/css" rel="stylesheet" media="all">
 

    <!-- Le fav and touch icons -->
  <!-- Update these with your own images
    <link rel="shortcut icon" href="images/favicon.ico">
    <link rel="apple-touch-icon" href="images/apple-touch-icon.png">
    <link rel="apple-touch-icon" sizes="72x72" href="images/apple-touch-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="114x114" href="images/apple-touch-icon-114x114.png">
  -->
  </head>

  <body>

    <div class="navbar">
      <div class="navbar-inner">
        <div class="container">
          <a class="brand" href="/">Jouyouyun&#39;s Blog</a>
          <ul class="nav">
            
              


  <li><a href="/archive">Archive</a></li>


            
              


  <li><a href="/tags">Tags</a></li>


            
              


  <li><a href="/categories">Categories</a></li>


            
              


  <li><a href="/about">About Me</a></li>


            
          </ul>
        </div>
      </div>
    </div>

    <div class="container">

      <div class="content">
        <div class="page-header">
  <h1>Linux 时间标准 </h1>
</div>

<div class="row">
  <div class="span8">
    <h2>系统如何设置时间</h2>

<ol>
<li>开机时根据硬件时钟来设置系统时钟.</li>
<li>如果开启了 <code>NTP</code> 服务, 会根据网络时间来校正系统时钟，确保时间准确.</li>
<li>关机时会根据系统时钟来设置硬件时钟(<code>localtime</code> 标准除外).</li>
</ol>

<h3>时钟</h3>

<ul>
<li>硬件时钟: 即实时时钟 <code>RTC</code> 或 <code>CMOS</code> 时钟, 仅能保存年、月、日、时、分、秒这些时间数值，无法保存时间标准和是否使用夏令时调节.</li>
<li>系统时钟: 即软件时间, 与硬件时间分别维护，保存了时间、时区和夏令时设置.初始系统时钟是从硬件时间计算得来，计算时会考虑 <code>/etc/adjtime</code> 的设置.</li>
<li><code>/etc/adjtime</code>: 这个文件中记录了时区标准和时间偏移, 根据硬件时钟设置系统时间和设置硬件时钟都会根据时间偏移来计算的.所有的时钟都是有误差的，但是一般有固定的偏移, 这种于基值的差称为“time skew”或“时间偏移”.</li>
</ul>

<hr />

<h3>时间标准</h3>

<ul>
<li><code>UTC</code> 是与时区无关的全球时间标准, 会根据夏令时自动调整时间, <strong>推荐使用</strong>.</li>
<li><code>localtime</code> 则依赖于当前时区, 不会根据夏令时自动调整.</li>
</ul>

<p>通常在 <code>window+linux</code> 双系统中遇到的时间问题就是使用的时间标准不一致导致的，只要将两个系统的时间标准调成一致的，就能解决此问题，推荐将 <code>window</code> 的时间标准改为 <code>UTC</code>。</p>

<hr />

<h3>示例</h3>

<p>假设当前 <code>RTC</code> 时间为 <code>12:00</code>, 时区为 <code>Asia/Shanghai</code>, 时区的 <code>offset</code> 为8, 两种不同的时间标准的处理如下:</p>

<ul>
<li><code>UTC</code> 时间标准: 系统开机时会根据 <code>RTC</code> 时间和时区的 <code>offset</code> 将系统时间调整为 <code>20:00</code>, <code>UTC</code> 时区的时间为 <code>12:00</code>, 关机时使用 <code>UTC</code> 的时间来设置 <code>RTC</code>.</li>
<li><code>localtime</code> 时间标准: 开始时根据 <code>RTC</code> 和时区 <code>offset</code>, 将系统时间调整为 <code>12:00</code>, <code>UTC</code> 时区的时间为 <code>04:00</code>, 关机时不再设置 <code>RTC</code>.</li>
</ul>

<p>如果开启了 <code>NTP</code> 服务, 系统会在运行时通过网络时间校准本机的 <code>UTC</code> 时间, 本机的 <code>UTC</code> 时间改变后, 系统时钟的时间也会跟着改变. 所以建议开启 <code>NTP</code> 服务, 这能保证时间的准确性，
但如果采用的是 <code>localtime</code> 时间标准，在 <code>NTP</code> 同步后不会修改 <code>RTC</code> 时间。</p>

<hr />

<hr />

<h2>systemd 时间服务</h2>

<h3>timedatectl</h3>

<p>用来查询和设置系统时间的命令, 使用方法如下:</p>

<pre><code class="language-sh">timedatectl [OPTIONS...] COMMAND ...

Query or change system time and date settings.

-h --help                Show this help message
--version             Show package version
--no-pager            Do not pipe output into a pager
--no-ask-password     Do not prompt for password
-H --host=[USER@]HOST    Operate on remote host
-M --machine=CONTAINER   Operate on local container
--adjust-system-clock Adjust system clock when changing local RTC mode

Commands:
status                   Show current time settings
set-time TIME            Set system time
set-timezone ZONE        Set system time zone
list-timezones           Show known time zones
set-local-rtc BOOL       Control whether RTC is in local time
set-ntp BOOL             Enable or disable network time synchronization
</code></pre>

<p>设置时区时会创建一个 <code>/etc/localtime</code> 软链接，指向 <code>/usr/share/zoneinfo/</code> 中的时区文件.</p>

<hr />

<h3>systemd-timesyncd</h3>

<p>提供了时间同步的功能, 基于 <code>SNTP</code> 实现, <code>SNTP</code> 是 <code>NTP</code> 协议的一种简单实现, 不需要长时间的存储状态, 适用与非服务器的桌面系统和嵌入式系统.</p>

<p><code>deepin</code> 的时间同步功能就是用它实现的.</p>

<hr />

<h3>systemd-timedated</h3>

<p><code>timedatectl</code> 的功能的 <code>dbus</code> 接口, 提供的方法和属性如下:</p>

<pre><code class="language-sh">$ gdbus introspect --system --dest org.freedesktop.timedate1 --object-path /org/freedesktop/timedate1
node /org/freedesktop/timedate1 {
interface org.freedesktop.timedate1 {
methods:
SetTime(in  x usec_utc,
in  b relative,
in  b user_interaction);
SetTimezone(in  s timezone,
in  b user_interaction);
SetLocalRTC(in  b local_rtc,
in  b fix_system,
in  b user_interaction);
SetNTP(in  b use_ntp,
in  b user_interaction);
signals:
properties:
readonly s Timezone = 'Europe/Berlin';
readonly b LocalRTC = false;
readonly b NTP = true;
readonly b NTPSynchronized = true;
readonly t TimeUSec = 1467291739170844;
readonly t RTCTimeUSec = 1467291739000000;
};
</code></pre>

<hr />

<hr />

<h2>Timezone</h2>

<p>时区列表是由 <code>tzdata</code> 这个包提供的, 安装在 <code>/usr/share/zoneinfo/</code> 下面.</p>

<p>有些地方为了节约能源, 在夏天时会把时间调慢. 当时区中有夏令时系统会自动调整时间.</p>

<p>使用 <code>zdump</code> 命令可以查看时区的详细信息, 如查询 <code>America/New_York</code> 的夏令时时区信息：</p>

<pre><code class="language-sh">~  zdump -v -c 2016,2017 America/New_York
America/New_York  Sun Mar 13 06:59:59 2016 UT = Sun Mar 13 01:59:59 2016 EST isdst=0 gmtoff=-18000
America/New_York  Sun Mar 13 07:00:00 2016 UT = Sun Mar 13 03:00:00 2016 EDT isdst=1 gmtoff=-14400
America/New_York  Sun Nov  6 05:59:59 2016 UT = Sun Nov  6 01:59:59 2016 EDT isdst=1 gmtoff=-14400
America/New_York  Sun Nov  6 06:00:00 2016 UT = Sun Nov  6 01:00:00 2016 EST isdst=0 gmtoff=-18000
</code></pre>

<p>其中 <code>isdst=1</code> 就表示夏令时被启用.</p>

    <hr>
    <div class="pagination">
      <ul>
        <ul>
          
            <li class="prev"><a href="/Blog/Linux-%E4%BC%91%E7%9C%A0%E8%87%AA%E5%8A%A8%E5%94%A4%E9%86%92/" title="Linux 休眠自动唤醒">&larr; Previous</a></li>
          
          

            <li><a href="/archive">Archive</a></li>

          
            <li class="next"><a href="/Blog/%E4%BF%AE%E5%A4%8D-superblock/" title="修复 superblock">Next &rarr;</a></li>
          
          
        </ul>
      </ul>
    </div>
    <hr>
    
<div id="disqus_thread"></div>
<script>
    var disqus_developer = 1;
    var disqus_shortname = 'jekyllbootstrap'; // required: replace example with your forum shortname
    /* * * DON'T EDIT BELOW THIS LINE * * */
    (function() {
        var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
        dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
    })();
</script>
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
<a href="http://disqus.com" class="dsq-brlink">blog comments powered by <span class="logo-disqus">Disqus</span></a>

  </div>
  
  <div class="span4">
    <h4>Published</h4>
    <div class="date"><span>2018-08-27</span></div>
    <br>
    <h4>Categories</h4>
    <ul class="tag_box">
    
      <li>
  <a href="/categories/#Blog-ref">Blog <span>23</span></a>
</li>
    
    </ul>
    <br>
    <h4>Tags</h4>
    <ul class="tag_box">
    
      <li>
  <a href="/tags/#timezone-ref">timezone <span>1</span></a>
</li>
    
      <li>
  <a href="/tags/#localtime-ref">localtime <span>1</span></a>
</li>
    
      <li>
  <a href="/tags/#rtc-ref">rtc <span>2</span></a>
</li>
    
      <li>
  <a href="/tags/#utc-ref">utc <span>1</span></a>
</li>
    
    </ul>
  </div>
</div>

      </div>

      <footer>
        <p>&copy; jouyouyun 2013 
          with help from <a href="http://github.com/wendal/gor" target="_blank" title="Gor -- Fast Blog">Gor</a>
          and <a href="http://twitter.github.com/bootstrap/" target="_blank">Twitter Bootstrap</a>
		  and Idea from <a href="http://ruhoh.com" target="_blank" title="The Definitive Technical Blogging Framework">ruhoh</a>
        </p>
      </footer>

    </div> <!-- /container -->

    
<script src="//cdnjscn.b0.upaiyun.com/libs/prettify/r298/prettify.min.js"></script>
<script>
  var pres = document.getElementsByTagName("pre");
  for (var i=0; i < pres.length; ++i) {
    pres[i].className = "prettyprint linenums";
  }
  prettyPrint();
</script>

    
<script type="text/javascript">

  var _gaq = _gaq || [];
  var pluginUrl = '//www.google-analytics.com/plugins/ga/inpage_linkid.js';
  _gaq.push(['_require', 'inpage_linkid', pluginUrl]);
  _gaq.push(['_setAccount', 'UA-123-12']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>
  </body>
</html>
